package br.com.edumobi.activities;

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import java.util.List;
import br.com.edumobi.P;
import br.com.edumobi.R;
import br.com.edumobi.dados.modelos.Alternativa;
import br.com.edumobi.dados.modelos.Aluno;
import br.com.edumobi.dados.modelos.Classificacao;
import br.com.edumobi.dados.modelos.Questao;
import br.com.edumobi.dados.modelos.Simulado;
import br.com.edumobi.excecoes.ExcecaoConsultaMalsucedida;
import br.com.edumobi.fragments.DashboardFragment;
import br.com.edumobi.utils.Dates;

public class DashboardActivity extends GenericaActivity implements DashboardFragment.AcoesDashboardFragment {

    public static final String EXTRA_ALUNO = "EXTRA_ALUNO";

    private Intent intentClassificacoesInferiores;

    private static final int REQUEST_CODE_CLASSIFICACOES_INFERIORES = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_dashboard);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_dashboard, menu);
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.itemDadosMenu:
                Intent intentDadosAluno = new Intent(this, DadosAlunoActivity.class);
                intentDadosAluno.putExtra(DadosAlunoActivity.EXTRA_ALUNO, obterAluno());
                startActivity(intentDadosAluno);
                return true;
            case R.id.itemConfiguracoesMenu:
                return true;
            case R.id.itemSairMenu:
                preferencesEditor.putString(P.PREFERENCES_USUARIO_SENHA, P.STRING_EMPITY);
                preferencesEditor.commit();
                startActivity(new Intent(this, LoginActivity.class));
                finish();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode) {
            case REQUEST_CODE_CLASSIFICACOES_INFERIORES:
                intentClassificacoesInferiores = null;
                break;
            default:
                break;
        }
    }

    @Override
    public Aluno obterAluno() {
        return (Aluno) getIntent().getSerializableExtra(EXTRA_ALUNO);
    }

    @Override
    public List<Classificacao> obterClassificacoesSuperiores(Classificacao classificacaoSuperior) {
        return local.consultarClassificacoesPorClassificacaoSuperior(classificacaoSuperior);
    }

    @Override
    public void abrirClassificacao(Classificacao classificacao) {
        if (intentClassificacoesInferiores == null) {
            intentClassificacoesInferiores = new Intent(this, ClassificacoesActivity.class);
            intentClassificacoesInferiores.putExtra(ClassificacoesActivity.EXTRA_CLASSIFICACAO, classificacao);
            startActivityForResult(intentClassificacoesInferiores, REQUEST_CODE_CLASSIFICACOES_INFERIORES);
        }
    }

    @Override
    public boolean atualizarConteudoLocal() {
        Log.i("DASHBOARD", "Listando as classificacoes da base local.");
        for (Classificacao classificacao : local.consultarClassificacoes()) {
            Log.i("DASHBOARD", "Listando as questoes da classificacao.");
            for (Questao questao : local.consultarQuestoesPorClassificacao(classificacao)) {
                Log.i("DASHBOARD", "Listando as alternativas da questao.");
                for (Alternativa alternativa : local.consultarAlternativaPorQuestao(questao)) {
                    Log.i("DASHBOARD", "Removendo alternativa " + alternativa.id + ".");
                    local.removerAlternativa(alternativa);
                }
                Log.i("DASHBOARD", "Removendo questao " + questao.id + ".");
                local.removerQuestao(questao);
            }
            Log.i("DASHBOARD", "Listando simulados da classificacao.");
            for (Simulado simulado : local.consultarSimuladosPorClassificacao(classificacao)) {
                Log.i("DASHBOARD", "Removendo simulado " + simulado.id + ".");
                local.removerSimulado(simulado);
            }
            Log.i("DASHBOARD", "Removendo classificacao " + classificacao.id + ".");
            local.removerClassificacao(classificacao);
        }

        try {
            Log.i("DASHBOARD", "Consultando classificacoes do aluno na nuvem.");
            Log.i("DASHBOARD", "Listando classificacoes.");
            for (Classificacao classificacao : nuvem.consultarClassificacoesDoAluno(obterAluno())) {
                if (local.consultarClassificacaoPorId(classificacao.id) == null) {
                    Log.i("DASHBOARD", "Inserindo classificacao: " + classificacao.nome);
                    local.inserirClassificacao(classificacao);
                    if (classificacao.classificacaoSuperior != null && local.consultarClassificacaoPorId(classificacao.classificacaoSuperior.id) == null) {
                        Log.i("DASHBOARD", "Inserindo classificacao superior: " + classificacao.classificacaoSuperior.nome);
                        local.inserirClassificacao(classificacao.classificacaoSuperior);
                    }
                } else {
                    if (!local.consultarClassificacaoPorId(classificacao.id).equals(classificacao)) {
                        Log.i("DASHBOARD", "Alterando classificacao: " + classificacao.nome);
                        local.alterarClassificacao(classificacao);
                    }
                }
                if (classificacao.questoes != null) {
                    Log.i("DASHBOARD", "Listando questoes da classificacao.");
                    for (Questao questao : classificacao.questoes) {
                        if (local.consultarQuestaoPorId(questao.id) == null) {
                            Log.i("DASHBOARD", "Inserindo questao.");
                            local.inserirQuestao(questao, classificacao);
                        } else {
                            if (!local.consultarQuestaoPorId(questao.id).equals(questao)) {
                                Log.i("DASHBOARD", "Alterando questao.");
                                local.alterarQuestao(questao, classificacao);
                            }
                        }
                        if (questao.alternativas != null) {
                            Log.i("DASHBOARD", "Listando alternativas da questao.");
                            for (Alternativa alternativa : questao.alternativas) {
                                if (local.consultarAlternativaPorId(alternativa.id) == null) {
                                    Log.i("DASHBOARD", "Inserindo alternativa.");
                                    local.inserirAlternativa(alternativa, questao);
                                } else {
                                    if (!local.consultarAlternativaPorId(alternativa.id).equals(alternativa)) {
                                        Log.i("DASHBOARD", "Alterando alternativa.");
                                        local.alterarAlternativa(alternativa, questao);
                                    }
                                }
                            }
                        }
                    }
                }
            }

            salvarPreferencesDataAtualizacao(Dates.agora());

            return true;
        } catch (ExcecaoConsultaMalsucedida excecao) {
            return false;
        }
    }
}